update to current version

all initial features implemented
tbd:
   etrack
   front
This commit is contained in:
Szakalakamaka
2020-09-01 09:50:30 +02:00
parent 16dec0fc4d
commit 0223adb1cf
41 changed files with 373 additions and 377 deletions

4
Jenkinsfile vendored
View File

@@ -4,12 +4,12 @@ pipeline {
stages { stages {
stage('Build') { stage('Build') {
steps { steps {
sh "sudo docker-compose build" sh "docker-compose build"
} }
} }
stage('Deploy') { stage('Deploy') {
steps { steps {
sh "sudo docker-compose up -d" sh "docker-compose up -d"
} }
} }
} }

View File

@@ -11,7 +11,7 @@
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.3.1.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-thymeleaf:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.3.1.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.3.1.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" /> <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
@@ -21,22 +21,6 @@
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" /> <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" /> <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.26" level="project" /> <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis-reactive:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-thymeleaf:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf:3.0.11.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf:3.0.11.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.attoparser:attoparser:2.0.5.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.attoparser:attoparser:2.0.5.RELEASE" level="project" />
@@ -52,7 +36,6 @@
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.0" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.3.1.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.36" level="project" /> <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.36" level="project" />
<orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.36" level="project" /> <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.36" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.7.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.7.RELEASE" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.7.RELEASE" level="project" />
@@ -96,9 +79,33 @@
<orderEntry type="library" scope="TEST" name="Maven: io.projectreactor:reactor-test:3.3.6.RELEASE" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: io.projectreactor:reactor-test:3.3.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.6.RELEASE" level="project" /> <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" /> <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" name="Maven: redis.clients:jedis:3.3.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.8.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.16.1" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.16.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.1.5.Final" level="project" />
<orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.50.Final" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis-reactive:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.cwbase:logback-redis-appender:1.1.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.8.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: redis.clients:jedis:3.3.0" level="project" />
<orderEntry type="library" name="Maven: jakarta.persistence:jakarta.persistence-api:2.2.3" level="project" />
</component> </component>
</module> </module>

View File

@@ -1,7 +1,7 @@
# R11-Klaus # R11-Klaus
Mockup service for middleware testing Mockup service for middleware testing
[![Build Status](https://travis-ci.com/Szakalakamaka/R11-Klaus.svg?token=Tt3QbF7q4wiFNnCGkuew&branch=master)](https://travis-ci.com/Szakalakamaka/R11-Klaus) [![Build Status](https://travis-ci.com/Szakalakamaka/Klaus.svg?token=Tt3QbF7q4wiFNnCGkuew&branch=master)](https://travis-ci.com/Szakalakamaka/Klaus)
Available scripts: Available scripts:

56
pom.xml
View File

@@ -19,14 +19,6 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId> <artifactId>spring-boot-starter-thymeleaf</artifactId>
@@ -60,6 +52,10 @@
<groupId>org.junit.vintage</groupId> <groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId> <artifactId>junit-vintage-engine</artifactId>
</exclusion> </exclusion>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <dependency>
@@ -67,18 +63,50 @@
<artifactId>reactor-test</artifactId> <artifactId>reactor-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency> <dependency>
<groupId>org.assertj</groupId> <groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId> <artifactId>assertj-core</artifactId>
<version>3.16.1</version> <version>3.16.1</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>com.cwbase</groupId>
<artifactId>logback-redis-appender</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>2.2.3</version>
</dependency>
</dependencies>
<build> <build>
<plugins> <plugins>

View File

@@ -3,6 +3,7 @@ package com.release11.klaus;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication @SpringBootApplication
public class KlausApplication { public class KlausApplication {
@@ -14,6 +15,8 @@ public class KlausApplication {
//TODO Jenkins //TODO Jenkins
//TODO history logs //TODO history logs
//TODO form validation
//TODO JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, redisPassword) //TODO JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, redisPassword)
//TODO JedisPool optimalization https://partners-intl.aliyun.com/help/doc-detail/98726.htm //TODO JedisPool optimalization https://partners-intl.aliyun.com/help/doc-detail/98726.htm
// loging and security
// tracking clients activity
// use a centralized logging collection tool like logstash

View File

@@ -5,9 +5,16 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import redis.clients.jedis.JedisPool; import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import java.util.Objects;
@Configuration @Configuration
@EnableRedisRepositories
@PropertySource("classpath:data-access.properties") @PropertySource("classpath:data-access.properties")
public class RedisConfig { public class RedisConfig {
@@ -15,11 +22,20 @@ public class RedisConfig {
private Environment environment; private Environment environment;
@Bean @Bean
JedisPool jedisPool(){ JedisConnectionFactory jedisConnectionFactory() {
final JedisPool pool = new JedisPool(environment.getProperty("redis.host"), RedisStandaloneConfiguration redisStandaloneConfiguration =
Integer.parseInt(environment.getProperty("redis.port"))); new RedisStandaloneConfiguration(Objects.requireNonNull(environment.getProperty("redis.host")),
return pool; Integer.parseInt(Objects.requireNonNull(environment.getProperty("redis.port"))));
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
redisTemplate.setExposeConnection(true);
redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
} }
} }

View File

@@ -1,10 +1,12 @@
package com.release11.klaus.controller; package com.release11.klaus.controller;
import com.release11.klaus.utilis.BusinessKey;
import com.release11.klaus.utilis.TrackingClient;
import com.release11.klaus.model.MockedResponseDto;
import com.release11.klaus.service.KlausService; import com.release11.klaus.service.KlausService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.RequestEntity; import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
@@ -13,6 +15,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
@Controller("/") @Controller("/")
@@ -22,18 +25,29 @@ public class KlausController {
private final KlausService klausService; private final KlausService klausService;
@RequestMapping(value = "klaus/v1/get/{clientUUID}/{mockedResponseId}")
public ResponseEntity getMockedResponse(@PathVariable UUID clientUUID,
@PathVariable int mockedResponseId){
TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "getMockedResponse",
BusinessKey.CLIENT_UUID, String.valueOf(clientUUID),
BusinessKey.MESSAGE_ID, String.valueOf(mockedResponseId)));
return klausService.getMockedResponse(clientUUID, mockedResponseId);
}
@PostMapping(value = "klaus/v1/set/{clientUUID}/{mockedResponseId}") @PostMapping(value = "klaus/v1/set/{clientUUID}/{mockedResponseId}")
public ResponseEntity<String> setMockedResponse(@PathVariable UUID clientUUID, public ResponseEntity<String> setMockedResponse(@PathVariable UUID clientUUID,
@PathVariable int mockedResponseId, @PathVariable int mockedResponseId,
@RequestParam(required = false) int httpStatus, @RequestParam(required = false) int httpStatus,
RequestEntity<String> requestEntity){ RequestEntity<String> requestEntity){
return klausService.setMockedResponse(clientUUID, mockedResponseId, HttpStatus.valueOf(httpStatus), requestEntity); TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "setMockedResponse",
} BusinessKey.CLIENT_UUID, String.valueOf(clientUUID),
BusinessKey.MESSAGE_ID, String.valueOf(mockedResponseId)));
@RequestMapping(value = "klaus/v1/get/{clientUUID}/{mockedResponseId}") MockedResponseDto mockedResponseDto = new MockedResponseDto(clientUUID, mockedResponseId,
public ResponseEntity getMockedResponse(@PathVariable UUID clientUUID, requestEntity.getHeaders().getContentType().toString(), requestEntity.getBody(),
@PathVariable int mockedResponseId){ requestEntity.getHeaders().toSingleValueMap(), httpStatus);
return klausService.getMockedResponse(clientUUID, mockedResponseId); return klausService.setMockedResponse(mockedResponseDto);
} }
} }

View File

@@ -1,20 +1,20 @@
package com.release11.klaus.controller; package com.release11.klaus.controller;
import com.release11.klaus.utilis.BusinessKey;
import com.release11.klaus.utilis.TrackingClient;
import com.release11.klaus.model.MockedResponseDto; import com.release11.klaus.model.MockedResponseDto;
import com.release11.klaus.service.KlausService; import com.release11.klaus.service.KlausService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*; import org.springframework.http.*;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.validation.BindingResult;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.net.URI; import javax.validation.Valid;
import java.util.Arrays; import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
@Slf4j @Slf4j
@@ -22,47 +22,44 @@ import java.util.UUID;
@RequestMapping @RequestMapping
@AllArgsConstructor @AllArgsConstructor
public class KlausMvcController { public class KlausMvcController {
private final String SET_MOCKED_RESPONSE_PATH_V1 = "/klaus/v1/set/";
private final String apiHost = "http://localhost:8097";
private final KlausService klausService; private final KlausService klausService;
@GetMapping("/login") @GetMapping("/login")
public String login(Model model) { public String login(Model model) {
UUID uuid = UUID.randomUUID(); model.addAttribute("clientUUID", UUID.randomUUID());
model.addAttribute("clientUUID", uuid);
return "login"; return "login";
} }
@GetMapping("/home") @GetMapping("/home")
public String showHome(Model model, @RequestParam UUID clientUUID) { public String showHome(Model model, @RequestParam UUID clientUUID) {
model.addAttribute("mockedResponseDto", new MockedResponseDto(clientUUID, 1, model.addAttribute("mockedResponseDto", new MockedResponseDto(clientUUID, 1,
"body", new HttpHeaders(), "application/xml")); "application/xml", "body", new HashMap<>(), 200));
return "index"; return "index";
} }
//TODO refactor //TODO refactor
//TODO form validation and proper error messages
@PostMapping("/home") @PostMapping("/home")
public String showHomePost(Model model, MockedResponseDto mockedResponseDto, public String showHomePost(@Valid MockedResponseDto mockRsp, BindingResult bindingResult, Model model,
@RequestParam(required = false) String[] header, @RequestParam(required = false) String[] header,
@RequestParam(required = false) String[] value, @RequestParam(required = false) String[] value) throws Exception {
@RequestParam(required = false) int httpStatus) { if (bindingResult.hasErrors()) {
log.info(mockedResponseDto.toString()); return "index";
URI uri = URI.create(apiHost + SET_MOCKED_RESPONSE_PATH_V1 + mockedResponseDto.getClientUUID() + "/" }
+ mockedResponseDto.getMockedResponseId()); TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "setMockedResponse",
BusinessKey.CLIENT_UUID, String.valueOf(mockRsp.getClientUUID()),
BusinessKey.MESSAGE_ID, String.valueOf(mockRsp.getMockedResponseId())));
log.info(mockRsp.toString());
HttpHeaders httpHeaders = new HttpHeaders(); HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.valueOf(mockedResponseDto.getMediaType())); httpHeaders.setContentType(MediaType.valueOf(mockRsp.getMediaType()));
if (header!=null){ if (header!=null){
for (int i = 0; i < header.length; i++) { for (int i = 0; i < header.length; i++) {
httpHeaders.set(header[i], value[i]); httpHeaders.set(header[i], value[i]);
}} }}
RequestEntity<String> requestEntity = new RequestEntity<String>(mockedResponseDto.getMessageBody(), MockedResponseDto mockedResponseDto = new MockedResponseDto(mockRsp.getClientUUID(), mockRsp.getMockedResponseId(),
httpHeaders, HttpMethod.POST, uri); mockRsp.getMediaType(), mockRsp.getMessageBody(), httpHeaders.toSingleValueMap(), mockRsp.getHttpStatus());
klausService.setMockedResponse(mockedResponseDto.getClientUUID(), mockedResponseDto.getMockedResponseId(),
HttpStatus.valueOf(httpStatus), requestEntity);
model.addAttribute("mockedResponseDto", new MockedResponseDto(mockedResponseDto.getClientUUID(), 1, klausService.setMockedResponse(mockedResponseDto);
"body", new HttpHeaders(), "application/xml"));
model.addAttribute("mockSaved", "true"); model.addAttribute("mockSaved", "true");
return "index"; return "index";
} }
@@ -70,7 +67,16 @@ public class KlausMvcController {
@GetMapping("/home/getMockedResponse") @GetMapping("/home/getMockedResponse")
@ResponseBody @ResponseBody
public String showGetMockedResponse(MockedResponseDto mockedResponseDto) { public String showGetMockedResponse(MockedResponseDto mockedResponseDto) {
return klausService.getMockedResponse(mockedResponseDto.getClientUUID(), TrackingClient.setBusinessKeys(Map.of(BusinessKey.INTERFACE_NAME, "getMockedResponse",
BusinessKey.CLIENT_UUID, String.valueOf(mockedResponseDto.getClientUUID()),
BusinessKey.MESSAGE_ID, String.valueOf(mockedResponseDto.getMockedResponseId())));
return klausService.getMockedResponse(mockedResponseDto.getClientUUID(),
mockedResponseDto.getMockedResponseId()).toString(); mockedResponseDto.getMockedResponseId()).toString();
} }
private void setHeaders(MockedResponseDto mockedResponseDto, String[] header, String[] value){
}
} }

View File

@@ -1,22 +1,44 @@
package com.release11.klaus.model; package com.release11.klaus.model;
import lombok.AllArgsConstructor; import com.release11.klaus.model.constraints.HttpCode;
import lombok.Builder; import lombok.*;
import lombok.Data; import org.springframework.data.annotation.Id;
import lombok.NoArgsConstructor; import org.springframework.data.redis.core.RedisHash;
import org.springframework.http.HttpHeaders; import org.springframework.data.redis.core.index.Indexed;
import org.springframework.http.RequestEntity;
import javax.validation.constraints.Positive;
import java.io.Serializable;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
@Data @Data
@ToString
@RedisHash("MockedResponseDto")
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder public final class MockedResponseDto implements Serializable {
public class MockedResponseDto { @Id
private String compositePrimaryKey;
@Indexed
private UUID clientUUID; private UUID clientUUID;
@Positive
private int mockedResponseId; private int mockedResponseId;
private String messageBody;
private HttpHeaders httpHeaders;
private String mediaType; private String mediaType;
private String messageBody;
private Map<String, String> httpHeaders;
@HttpCode
private Integer httpStatus;
public MockedResponseDto(UUID clientUUID, int mockedResponseId, String mediaType,
String messageBody, Map<String, String> httpHeaders, Integer httpStatus) {
this.compositePrimaryKey = clientUUID.toString() + "_" + mockedResponseId;
this.clientUUID = clientUUID;
this.mockedResponseId = mockedResponseId;
this.mediaType = mediaType;
this.messageBody = messageBody;
this.httpHeaders = httpHeaders;
this.httpStatus = httpStatus;
}
} }

View File

@@ -1,66 +0,0 @@
package com.release11.klaus.repository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
@Slf4j
@Repository
@Transactional
@AllArgsConstructor
public class MockedResponseRedisRepository implements MockedResponseRepository {
private final JedisPool jedisPool;
//TODO redis persistence
public ResponseEntity<String> getMockedResponse(UUID clientUUID, int mockedResponseId){
String body, httpCodeStatus;
String key = String.format("%s_%s", clientUUID.toString(), mockedResponseId);
HttpHeaders responseHeaders = new HttpHeaders();
try(Jedis jedis = jedisPool.getResource()){
body = jedis.get(key + "_body");
Map<String, String> headerMap = jedis.hgetAll(key + "_headers");
headerMap.forEach(responseHeaders::set);
httpCodeStatus = jedis.get(key + "_httpCodeStatus");
}
return new ResponseEntity<String>(body, responseHeaders,
Objects.requireNonNull(HttpStatus.valueOf(Integer.parseInt(httpCodeStatus))));
}
public ResponseEntity<String> setMockedResponse(UUID clientUUID, int mockedResponseId, HttpStatus httpStatus,
RequestEntity<String> requestEntity){
log.info("mockedResponseRepository, setMockedResponse, clientUUID {}, mockedResponseId {}, httpStatus{} requestEntity{} ",
clientUUID, mockedResponseId, httpStatus, requestEntity);
if (httpStatus == null){httpStatus = HttpStatus.OK;}
String key = String.format("%s_%s", clientUUID.toString(), mockedResponseId);
setMockedResponseBody(key + "_body", requestEntity.getBody());
setMockedResponseHeader(key + "_headers", requestEntity.getHeaders().toSingleValueMap());
setMockedResponseBody(key + "_httpCodeStatus", String.valueOf(httpStatus.value()));
return new ResponseEntity<String>("MockedResponse has been setup successfully! :D", new HttpHeaders(), HttpStatus.ACCEPTED);
}
private synchronized void setMockedResponseBody(String key, String body){
try(Jedis jedis = jedisPool.getResource()){
jedis.set(key, body);
}
}
private synchronized void setMockedResponseHeader(String key, Map<String, String> headers){
try(Jedis jedis = jedisPool.getResource()){
jedis.del(key);
headers.forEach((field, value)->jedis.hset(key, field, value));
}
}
}

View File

@@ -1,7 +1,11 @@
package com.release11.klaus.repository; package com.release11.klaus.repository;
import com.release11.klaus.model.MockedResponseDto;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.UUID;
@Repository @Repository
public interface MockedResponseRepository { public interface MockedResponseRepository extends CrudRepository<MockedResponseDto, String>{
} }

View File

@@ -1,5 +1,6 @@
package com.release11.klaus.service; package com.release11.klaus.service;
import com.release11.klaus.model.MockedResponseDto;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.RequestEntity; import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -8,6 +9,5 @@ import java.util.UUID;
public interface KlausService { public interface KlausService {
ResponseEntity<String> getMockedResponse(UUID clientUUID, int mockedResponseId); ResponseEntity<String> getMockedResponse(UUID clientUUID, int mockedResponseId);
ResponseEntity<String> setMockedResponse(UUID clientUUID, int mockedResponseId, HttpStatus httpStatus, ResponseEntity<String> setMockedResponse(MockedResponseDto mockedResponseDto);
RequestEntity<String> requestEntity);
} }

View File

@@ -1,13 +1,16 @@
package com.release11.klaus.service; package com.release11.klaus.service;
import com.release11.klaus.repository.MockedResponseRedisRepository; import com.release11.klaus.model.MockedResponseDto;
import com.release11.klaus.repository.MockedResponseRepository;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@Slf4j @Slf4j
@@ -15,21 +18,27 @@ import java.util.UUID;
@AllArgsConstructor @AllArgsConstructor
public class KlausServiceImpl implements KlausService { public class KlausServiceImpl implements KlausService {
private final MockedResponseRedisRepository mockedResponseRedisRepository; private final MockedResponseRepository mockedResponseRepository;
@Override @Override
public ResponseEntity<String> getMockedResponse(UUID clientUUID, int mockedResponseId) { public ResponseEntity<String> getMockedResponse(UUID clientUUID, int mockedResponseId) {
log.info("KlausServiceImpl, operation getMockedResponse, clientId {}, mockedResponseId {} ", log.info("KlausServiceImpl, operation getMockedResponse, clientId {}, mockedResponseId {} ",
clientUUID, mockedResponseId); clientUUID, mockedResponseId);
ResponseEntity<String> responseEntity = mockedResponseRedisRepository.getMockedResponse(clientUUID, mockedResponseId); String key = clientUUID.toString() + "_" + mockedResponseId;
return responseEntity; Optional<MockedResponseDto> optMockedResponseDto = mockedResponseRepository.findById(key);
MockedResponseDto mockedResponseDto = optMockedResponseDto.get();
HttpHeaders httpHeaders = new HttpHeaders();
mockedResponseDto.getHttpHeaders().forEach(httpHeaders::set);
return new ResponseEntity<>(mockedResponseDto.getMessageBody(), httpHeaders,
Objects.requireNonNull(HttpStatus.valueOf(mockedResponseDto.getHttpStatus())));
} }
@Override @Override
public ResponseEntity<String> setMockedResponse(UUID clientUUID, int mockedResponseId, HttpStatus httpStatus, public ResponseEntity<String> setMockedResponse(MockedResponseDto mockedResponseDto) {
RequestEntity<String> requestEntity) { mockedResponseRepository.save(mockedResponseDto);
log.info("KlausServiceImpl, operation setMockedResponse, messageBody {}, mockedResponseId {} ", log.info("KlausServiceImpl, operation setMockedResponse, mockedResponseDto {} ", mockedResponseDto.toString());
requestEntity, mockedResponseId); return new ResponseEntity<>("MockedResponse has been setup successfully!", new HttpHeaders(),
return mockedResponseRedisRepository.setMockedResponse(clientUUID, mockedResponseId, httpStatus,requestEntity); HttpStatus.ACCEPTED);
} }
} }

View File

@@ -1,9 +1,11 @@
server.port = 8099 server.port = 8097
spring.output.ansi.enabled = always spring.output.ansi.enabled = always
logging.file.name=/var/log/klaus/ #logging.file.name=/var/log/klaus/
logging.level.root=INFO logging.level.root=INFO
logging.level.org.springframework.web=DEBUG logging.level.org.springframework.web=INFO
logging.level.com.release11=DEBUG logging.level.com.release11=INFO
logging.file.max-size = 10MB logging.file.max-size = 10MB
spring.mvc.log-request-details=true spring.mvc.log-request-details=true
appender.rolling.layout.type = ESJsonLayout
appender.rolling.layout.type_name = server

View File

@@ -1,3 +1,2 @@
//redis.host = redis-server
redis.host = localhost redis.host = localhost
redis.port = 6379 redis.port = 6379

View File

@@ -3,94 +3,63 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Title</title> <title>Title</title>
<script type='text/javascript'> <script src="/js/main.js"></script>
function httpGetAsync()
{
var clientUUID = document.getElementById("clientUUID").value;
var mockedResponseId = document.getElementById("mockedResponseId").value;
var url = "http://localhost:8097/klaus/v1/get/" + clientUUID + "/" + mockedResponseId;
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
alert(xmlHttp.responseText);
}
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
var container = document.getElementById("getMockedResponse");
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode(xmlHttp.responseText));
}
function httpGet()
{
var clientUUID = document.getElementById("getClientUUID").value;
var mockedResponseId = document.getElementById("getMockedResponseId").value;
var url = "http://localhost:8097/klaus/v1/get/" + clientUUID + "/" + mockedResponseId;
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", url, false ); // false for synchronous request
xmlHttp.send( null );
var container = document.getElementById("getMockedResponse");
var headers = xmlHttp.getAllResponseHeaders();
container.appendChild(document.createTextNode(headers));
container.appendChild(document.createTextNode("Your message: "));
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode((xmlHttp.responseText)));
return xmlHttp.responseText;
}
var numberOfHeaders = 0;
function addFields(){
var container = document.getElementById("headers");
numberOfHeaders++;
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode("Header " + (numberOfHeaders)));
var headerInput = document.createElement("input");
headerInput.type = "text";
headerInput.name = "header";
container.appendChild(headerInput);
container.appendChild(document.createTextNode("Value " + (numberOfHeaders)));
var valueInput = document.createElement("input");
valueInput.type = "text";
valueInput.name = "value";
container.appendChild(valueInput);
}
</script>
</head> </head>
<body> <body>
<br>---------------------------------------------------------------------------------------------------------------- <hr>
<div><br>In order to set mockup response. Please send the response, that you want to receive, on: <div><br>In order to set mockup response. Please send the response, that you want to receive, on:
<br>http://localhost:8097/klaus/v1/set/ <a th:text="${mockedResponseDto.clientUUID}">clientUUID should be here</a>/{mockedResponseId}?httpStatus=200 <br>http://localhost:8097/klaus/v1/set/ <a th:text="${mockedResponseDto.clientUUID}">clientUUID should be here</a>/{mockedResponseId}?httpStatus=200
<br>or simply fill and submit the below form:</div> <br>or simply fill and submit the below form:</div>
<div class="col-lg-4 form-max"> <div class="col-lg-4 form-max">
sayHi('John');
<form action="#" th:action="@{/home}" th:object="${mockedResponseDto}" method="post"> <form action="#" th:action="@{/home}" th:object="${mockedResponseDto}" method="post">
<input type="text" th:field="*{clientUUID}" th:placeholder="*{clientUUID}" hidden/> <table>
<br><label >Mocked response id:</label><br/> <input type="text" th:field="*{clientUUID}" th:placeholder="*{clientUUID}" hidden/>
<input type="text" th:field="*{mockedResponseId}" th:value=1/> <tr>
<br><label >Mocked response body:</label><br/> <td>Mocked response id:</td>
<textarea rows="4" cols="50" th:field="*{messageBody}" th:placeholder='messageBody'></textarea> <td><input type="text" th:field="*{mockedResponseId}" th:value=1/></td>
<br><label >Mocked response http code status:</label><br/> <td th:if="${#fields.hasErrors('mockedResponseId')}" th:errors="*{mockedResponseId}">Id Error</td>
<input type="text" th:name="httpStatus" th:value='200' /> </tr>
<br>Provide mocked response headers: <a href="#" id="addHeader" onclick="addFields()">Add a new header</a> <tr>
<div id="headers"></div> <td>Mocked response body:</td>
<br><label >Media type:</label> <td><textarea rows="4" cols="50" th:field="*{messageBody}" th:placeholder='messageBody'></textarea></td>
<select th:field="*{mediaType}"> <td th:if="${#fields.hasErrors('messageBody')}" th:errors="*{messageBody}">Body Error</td>
<option value="application/xml">application/xml</option> </tr>
<option value="application/json">application/json</option> <tr>
<option value="text/xml">text/xml</option> <td>Mocked response http code status:</td>
</select> <td><input type="text" th:field="*{httpStatus}" th:value='200'></td>
<input type="submit" value="Save mocked response" onclick="submit()"/> <td th:if="${#fields.hasErrors('httpStatus')}" th:errors="*{httpStatus}">HttpStatus Error</td>
</tr>
<tr>
<td>Provide mocked response headers:</td>
<td><a href="#" id="addHeader" onclick="addFields()">Add a new header</a>
<table>
<tr>
<td><div id="headers"></div></td>
</tr>
</table>
</td>
</tr>
<tr>
<td>Media type:</td>
<td><select th:field="*{mediaType}">
<option value="application/xml">application/xml</option>
<option value="application/json">application/json</option>
<option value="text/xml">text/xml</option>
</select></td>
</tr>
<tr>
<td><input type="submit" value="Save mocked response"/></td>
</tr>
</table>
</form> </form>
<p th:if="${mockSaved}">Mock has been saved</p> <p th:if="${mockSaved}">Mock has been saved</p>
<br>---------------------------------------------------------------------------------------------------------------- <hr>
<div><br>In order to use the mocked response in your integration tests or simply <div><br>In order to use the mocked response in your integration tests or simply
get your mocked response please send a request to get your mocked response please send a request to
<br>http://localhost:8097/klaus/v1/get/<a th:text="${mockedResponseDto.clientUUID}">clientUUID should be here</a>/{mockedResponseId} <br>http://localhost:8097/klaus/v1/get/<a th:text="${mockedResponseDto.clientUUID}">clientUUID should be here</a>/{mockedResponseId}
@@ -104,7 +73,7 @@ function httpGet()
<input type="text" th:field="*{mockedResponseId}" th:placeholder="12345"/> <input type="text" th:field="*{mockedResponseId}" th:placeholder="12345"/>
<input type="submit" value="Get mocked response"/> <input type="submit" value="Get mocked response"/>
</form> </form>
<br>---------------------------------------------------------------------------------------------------------------- <hr>
</div> </div>
</div> </div>

View File

@@ -3,6 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Login</title> <title>Login</title>
<script src="/js/main.js"></script>
</head> </head>
<body> <body>
<div><br>Please move to the next step with your own client UUID: </div> <div><br>Please move to the next step with your own client UUID: </div>
@@ -16,5 +17,6 @@
<br><a th:text="${clientUUID}">clientUUID should be here</a> <br><a th:text="${clientUUID}">clientUUID should be here</a>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -3,12 +3,8 @@ package com.release11.klaus.config;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPool;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest @SpringBootTest
class RedisConfigTest { class RedisConfigTest {

View File

@@ -2,8 +2,6 @@ package com.release11.klaus.controller;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class KlausControllerTest { class KlausControllerTest {
@Test @Test

View File

@@ -1,6 +1,12 @@
package com.release11.klaus.controller; package com.release11.klaus.controller;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.http.HttpStatus;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -8,5 +14,6 @@ class KlausMvcControllerTest {
@Test @Test
void showHome() { void showHome() {
} }
} }

View File

@@ -12,5 +12,11 @@ class MockedResponseRedisRepositoryTest {
@Test @Test
void setMockedResponse() { void setMockedResponse() {
// System.out.println("Before Test, clearing Redis");
// JedisPool pool = new JedisPool("localhost");
// redis = pool.getResource();
// redis.ltrim(key, 1, 0);
} }
} }

View File

@@ -1,6 +1,7 @@
package com.release11.klaus.service; package com.release11.klaus.service;
import com.release11.klaus.repository.MockedResponseRedisRepository; import com.release11.klaus.model.MockedResponseDto;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
@@ -19,43 +20,44 @@ import static org.mockito.Mockito.*;
@SpringBootTest @SpringBootTest
class KlausServiceImplTest { class KlausServiceImplTest {
@Mock // @Mock
MockedResponseRedisRepository mockedResponseRedisRepository; // MockedResponseRedisRepository mockedResponseRedisRepository;
//
@InjectMocks // @InjectMocks
KlausServiceImpl klausServiceImpl; // KlausServiceImpl klausServiceImpl;
//
private final static UUID uuid = UUID.fromString("e4248095-100e-4f1f-8226-e722014ae29f"); // private final static UUID uuid = UUID.fromString("e4248095-100e-4f1f-8226-e722014ae29f");
private final static URI uri = URI.create("http//:localhost:8080"); // private final static URI uri = URI.create("http//:localhost:8080");
private static ResponseEntity<String> mockedResponseEntity; // private static ResponseEntity<String> mockedResponseEntity;
private static RequestEntity<String> mockedRequestEntity; // private static RequestEntity<String> mockedRequestEntity;
// private static MockedResponseDto mockedResponseDto = new MockedResponseDto(uuid, 1, "application/xml", "body",
@BeforeAll // new HttpHeaders(), 200);
public static void initializeMockEntities(){ //
HttpHeaders httpHeaders = new HttpHeaders(); // @BeforeAll
mockedResponseEntity = new ResponseEntity<String>("body", httpHeaders, HttpStatus.ACCEPTED); // public static void initializeMockEntities(){
mockedRequestEntity = new RequestEntity<String>(HttpMethod.POST, uri); // HttpHeaders httpHeaders = new HttpHeaders();
} // mockedResponseEntity = new ResponseEntity<String>("body", httpHeaders, HttpStatus.ACCEPTED);
// mockedRequestEntity = new RequestEntity<String>(HttpMethod.POST, uri);
@Test // }
void getMockedResponse() { //
when(mockedResponseRedisRepository.getMockedResponse(any(), anyInt())) // @Test
.thenReturn(mockedResponseEntity); // void getMockedResponse() {
//// when(mockedResponseRedisRepository.getMockedResponse(any(), anyInt()))
ResponseEntity<String> responseEntity = klausServiceImpl.getMockedResponse(uuid, 1); //// .thenReturn(mockedResponseEntity);
assertThat(responseEntity).isNotNull(); ////
verify(mockedResponseRedisRepository).getMockedResponse(any(), anyInt()); //// ResponseEntity<String> responseEntity = klausServiceImpl.getMockedResponse(uuid, 1);
} //// assertThat(responseEntity).isNotNull();
//// verify(mockedResponseRedisRepository).getMockedResponse(any(), anyInt());
@Test // }
void setMockedResponse() { //
when(mockedResponseRedisRepository.setMockedResponse(any(), anyInt(), any(), any())) // @Test
.thenReturn(mockedResponseEntity); // void setMockedResponse() {
// when(mockedResponseRedisRepository.setMockedResponse(any()))
ResponseEntity<String> responseEntity = klausServiceImpl.setMockedResponse(uuid, 1, // .thenReturn(mockedResponseEntity);
HttpStatus.ACCEPTED, mockedRequestEntity); //
assertThat(responseEntity).isNotNull(); // ResponseEntity<String> responseEntity = klausServiceImpl.setMockedResponse(mockedResponseDto);
verify(mockedResponseRedisRepository).setMockedResponse(any(), anyInt(), any(), any()); // assertThat(responseEntity).isNotNull();
} // verify(mockedResponseRedisRepository).setMockedResponse(any());
// }
} }

View File

@@ -1,9 +1,11 @@
server.port = 8099 server.port = 8098
spring.output.ansi.enabled = always spring.output.ansi.enabled = always
logging.file.name=/var/log/klaus/ #logging.file.name=/var/log/klaus/
logging.level.root=INFO logging.level.root=INFO
logging.level.org.springframework.web=DEBUG logging.level.org.springframework.web=INFO
logging.level.com.release11=DEBUG logging.level.com.release11=INFO
logging.file.max-size = 10MB logging.file.max-size = 10MB
spring.mvc.log-request-details=true spring.mvc.log-request-details=true
appender.rolling.layout.type = ESJsonLayout
appender.rolling.layout.type_name = server

View File

@@ -1,3 +1,2 @@
//redis.host = redis-server
redis.host = localhost redis.host = localhost
redis.port = 6379 redis.port = 6379

View File

@@ -3,94 +3,63 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Title</title> <title>Title</title>
<script type='text/javascript'> <script src="/js/main.js"></script>
function httpGetAsync()
{
var clientUUID = document.getElementById("clientUUID").value;
var mockedResponseId = document.getElementById("mockedResponseId").value;
var url = "http://localhost:8097/klaus/v1/get/" + clientUUID + "/" + mockedResponseId;
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
alert(xmlHttp.responseText);
}
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
var container = document.getElementById("getMockedResponse");
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode(xmlHttp.responseText));
}
function httpGet()
{
var clientUUID = document.getElementById("getClientUUID").value;
var mockedResponseId = document.getElementById("getMockedResponseId").value;
var url = "http://localhost:8097/klaus/v1/get/" + clientUUID + "/" + mockedResponseId;
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", url, false ); // false for synchronous request
xmlHttp.send( null );
var container = document.getElementById("getMockedResponse");
var headers = xmlHttp.getAllResponseHeaders();
container.appendChild(document.createTextNode(headers));
container.appendChild(document.createTextNode("Your message: "));
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode((xmlHttp.responseText)));
return xmlHttp.responseText;
}
var numberOfHeaders = 0;
function addFields(){
var container = document.getElementById("headers");
numberOfHeaders++;
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode("Header " + (numberOfHeaders)));
var headerInput = document.createElement("input");
headerInput.type = "text";
headerInput.name = "header";
container.appendChild(headerInput);
container.appendChild(document.createTextNode("Value " + (numberOfHeaders)));
var valueInput = document.createElement("input");
valueInput.type = "text";
valueInput.name = "value";
container.appendChild(valueInput);
}
</script>
</head> </head>
<body> <body>
<br>---------------------------------------------------------------------------------------------------------------- <hr>
<div><br>In order to set mockup response. Please send the response, that you want to receive, on: <div><br>In order to set mockup response. Please send the response, that you want to receive, on:
<br>http://localhost:8097/klaus/v1/set/ <a th:text="${mockedResponseDto.clientUUID}">clientUUID should be here</a>/{mockedResponseId}?httpStatus=200 <br>http://localhost:8097/klaus/v1/set/ <a th:text="${mockedResponseDto.clientUUID}">clientUUID should be here</a>/{mockedResponseId}?httpStatus=200
<br>or simply fill and submit the below form:</div> <br>or simply fill and submit the below form:</div>
<div class="col-lg-4 form-max"> <div class="col-lg-4 form-max">
sayHi('John');
<form action="#" th:action="@{/home}" th:object="${mockedResponseDto}" method="post"> <form action="#" th:action="@{/home}" th:object="${mockedResponseDto}" method="post">
<input type="text" th:field="*{clientUUID}" th:placeholder="*{clientUUID}" hidden/> <table>
<br><label >Mocked response id:</label><br/> <input type="text" th:field="*{clientUUID}" th:placeholder="*{clientUUID}" hidden/>
<input type="text" th:field="*{mockedResponseId}" th:value=1/> <tr>
<br><label >Mocked response body:</label><br/> <td>Mocked response id:</td>
<textarea rows="4" cols="50" th:field="*{messageBody}" th:placeholder='messageBody'></textarea> <td><input type="text" th:field="*{mockedResponseId}" th:value=1/></td>
<br><label >Mocked response http code status:</label><br/> <td th:if="${#fields.hasErrors('mockedResponseId')}" th:errors="*{mockedResponseId}">Id Error</td>
<input type="text" th:name="httpStatus" th:value='200' /> </tr>
<br>Provide mocked response headers: <a href="#" id="addHeader" onclick="addFields()">Add a new header</a> <tr>
<div id="headers"></div> <td>Mocked response body:</td>
<br><label >Media type:</label> <td><textarea rows="4" cols="50" th:field="*{messageBody}" th:placeholder='messageBody'></textarea></td>
<select th:field="*{mediaType}"> <td th:if="${#fields.hasErrors('messageBody')}" th:errors="*{messageBody}">Body Error</td>
<option value="application/xml">application/xml</option> </tr>
<option value="application/json">application/json</option> <tr>
<option value="text/xml">text/xml</option> <td>Mocked response http code status:</td>
</select> <td><input type="text" th:field="*{httpStatus}" th:value='200'></td>
<input type="submit" value="Save mocked response" onclick="submit()"/> <td th:if="${#fields.hasErrors('httpStatus')}" th:errors="*{httpStatus}">HttpStatus Error</td>
</tr>
<tr>
<td>Provide mocked response headers:</td>
<td><a href="#" id="addHeader" onclick="addFields()">Add a new header</a>
<table>
<tr>
<td><div id="headers"></div></td>
</tr>
</table>
</td>
</tr>
<tr>
<td>Media type:</td>
<td><select th:field="*{mediaType}">
<option value="application/xml">application/xml</option>
<option value="application/json">application/json</option>
<option value="text/xml">text/xml</option>
</select></td>
</tr>
<tr>
<td><input type="submit" value="Save mocked response"/></td>
</tr>
</table>
</form> </form>
<p th:if="${mockSaved}">Mock has been saved</p> <p th:if="${mockSaved}">Mock has been saved</p>
<br>---------------------------------------------------------------------------------------------------------------- <hr>
<div><br>In order to use the mocked response in your integration tests or simply <div><br>In order to use the mocked response in your integration tests or simply
get your mocked response please send a request to get your mocked response please send a request to
<br>http://localhost:8097/klaus/v1/get/<a th:text="${mockedResponseDto.clientUUID}">clientUUID should be here</a>/{mockedResponseId} <br>http://localhost:8097/klaus/v1/get/<a th:text="${mockedResponseDto.clientUUID}">clientUUID should be here</a>/{mockedResponseId}
@@ -104,7 +73,7 @@ function httpGet()
<input type="text" th:field="*{mockedResponseId}" th:placeholder="12345"/> <input type="text" th:field="*{mockedResponseId}" th:placeholder="12345"/>
<input type="submit" value="Get mocked response"/> <input type="submit" value="Get mocked response"/>
</form> </form>
<br>---------------------------------------------------------------------------------------------------------------- <hr>
</div> </div>
</div> </div>

View File

@@ -3,6 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Login</title> <title>Login</title>
<script src="/js/main.js"></script>
</head> </head>
<body> <body>
<div><br>Please move to the next step with your own client UUID: </div> <div><br>Please move to the next step with your own client UUID: </div>
@@ -16,5 +17,6 @@
<br><a th:text="${clientUUID}">clientUUID should be here</a> <br><a th:text="${clientUUID}">clientUUID should be here</a>
</div> </div>
</body> </body>
</html> </html>