Skip to content

Commit

Permalink
ContractsControllerFT added
Browse files Browse the repository at this point in the history
  • Loading branch information
akolod committed Mar 5, 2021
1 parent 88fc540 commit cdf0c47
Show file tree
Hide file tree
Showing 21 changed files with 407 additions and 13 deletions.
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ cache:
directories:
- $HOME/.m2

services:
- docker

jobs:
include:
- stage: build with maven & generate reports
Expand Down
2 changes: 2 additions & 0 deletions judge-d-agent/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,9 @@
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>${groovyAllVersion}</version>
<scope>test</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
Expand Down
5 changes: 0 additions & 5 deletions judge-d-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,6 @@
<artifactId>spock-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
Expand Down
20 changes: 20 additions & 0 deletions judge-d-server/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,9 @@
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>${groovyAllVersion}</version>
<scope>test</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
Expand Down Expand Up @@ -167,6 +169,24 @@
<artifactId>vaunt-core</artifactId>
<version>1.0.28</version>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<version>1.14.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>3.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
package com.hltech.judged.server

import io.restassured.RestAssured
import org.springframework.boot.web.server.LocalServerPort
import org.springframework.test.context.jdbc.Sql

@FunctionalTest
class ContractsControllerFT extends PostgresDatabaseSpecification {

@LocalServerPort
int serverPort

def 'should register contracts for a version of a service'() {
given:
def expectations = loadFromFileAndFormat('pact-frontend-to-backend-provider.json')
def capabilities = loadFromFileAndFormat('swagger-backend-provider.json')

when:
def response = RestAssured.given()
.port(serverPort)
.contentType("application/json")
.body("""
{
"capabilities":{
"rest":{"value":"${capabilities.replace('"','\\"')}","mimeType":"application/json"}
},
"expectations":{
"test-provider":{"rest":{"value":"${expectations.replace('"','\\"')}","mimeType":"application/json"}}
}
}
""")
.when()
.post("/contracts/services/test-provider/versions/'1.0'")
.then()
.statusCode(200)
.contentType("application/json")
.extract().body().jsonPath().getMap('$')

then:
def capabilitiesFromResponse = response['capabilities']['rest']
capabilitiesFromResponse['mimeType'] == "application/json"
capabilitiesFromResponse['value'] == capabilities

def expectationsFromResponse = response['expectations']['test-provider']['rest']
expectationsFromResponse['mimeType'] == "application/json"
expectationsFromResponse['value'] == expectations

and:
def capabilitiesFromDb = dbHelper.fetchCapabilities()
capabilitiesFromDb.size() == 1
capabilitiesFromDb[0]['service_name'] == 'test-provider'
capabilitiesFromDb[0]['service_version'] == "'1.0'"
capabilitiesFromDb[0]['protocol'] == "rest"
capabilitiesFromDb[0]['mime_type'] == "application/json"
capabilitiesFromDb[0]['value'] == capabilities

def expectationsFromDb = dbHelper.fetchExpectations()
capabilitiesFromDb.size() == 1
expectationsFromDb[0]['service_name'] == 'test-provider'
expectationsFromDb[0]['service_version'] == "'1.0'"
expectationsFromDb[0]['protocol'] == "rest"
expectationsFromDb[0]['mime_type'] == "application/json"
expectationsFromDb[0]['value'] == expectations

def serviceContractsFromDb = dbHelper.fetchServiceContracts()
serviceContractsFromDb.size() == 1
serviceContractsFromDb[0]['name'] == 'test-provider'
serviceContractsFromDb[0]['version'] == "'1.0'"
}

@Sql('ContractsControllerFT.GeRegisteredContracts.sql')
def 'should get registered contracts for service version'() {
given:
def expectations = loadFromFileAndFormat('pact-frontend-to-backend-provider.json')
def capabilities = loadFromFileAndFormat('swagger-backend-provider.json')

when:
def response = RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get("/contracts/services/test-provider/versions/'1.0'")
.then()
.statusCode(200)
.contentType("application/json")
.extract().body().jsonPath().getMap('$')

then:
response['name'] == 'test-provider'
response['version'] == "'1.0'"
def capabilitiesFromResponse = response['capabilities']['rest']
capabilitiesFromResponse['mimeType'] == "application/json"
capabilitiesFromResponse['value'] == capabilities

def expectationsFromResponse = response['expectations']['test-provider']['rest']
expectationsFromResponse['mimeType'] == "application/json"
expectationsFromResponse['value'] == expectations
}

@Sql('ContractsControllerFT.GeRegisteredContracts.sql')
def "should return 404 if service don't have registered contracts for service version"() {
expect:
RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get("/contracts/services/test-provider/versions/'9.9'")
.then()
.statusCode(404)
.contentType("application/json")
}

@Sql('ContractsControllerFT.GeRegisteredServices.sql')
def 'should get registered services names'() {
when:
def contracts = RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get(path)
.then()
.statusCode(200)
.contentType("application/json")
.extract().body().jsonPath().getList('$')

then:
contracts.size() == 4
contracts.containsAll(["test-provider", "test-provider2", "test-provider3", "test-provider4"])

where:
path << ["/contracts", "/contracts/services"]
}

@Sql('ContractsControllerFT.GetVersions.sql')
def 'should get registered versions for service'() {
when:
def versions = RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get("/contracts/services/test-provider/versions")
.then()
.statusCode(200)
.contentType("application/json")
.extract().body().jsonPath().getList('$')

then:
versions.size() == 4
versions.containsAll(["'1.0'", "'1.2'", "'2.0'", "'3.0'"])
}

@Sql('ContractsControllerFT.GetVersions.sql')
def "should return empty list if service doesn't have any version registered"() {
when:
def versions = RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get("/contracts/services/test-provider9/versions")
.then()
.statusCode(200)
.contentType("application/json")
.extract().body().jsonPath().getList('$')

then:
versions.size() == 0
}

@Sql('ContractsControllerFT.GeRegisteredContracts.sql')
def 'should get registered capabilities for service version and protocol'() {
given:
def capabilities = loadFromFileAndFormat('swagger-backend-provider.json')

when:
def response = RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get("/contracts/services/test-provider/versions/'1.0'/capabilities/rest")
.then()
.statusCode(200)
.contentType("application/json")
.extract().body().asString()

then:
response == capabilities
}

@Sql('ContractsControllerFT.GeRegisteredContracts.sql')
def "should return 404 if service doesn't have registered capabilities for protocol"() {
expect:
RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get("/contracts/services/test-provider/versions/'1.0'/capabilities/jms")
.then()
.statusCode(404)
.contentType("application/json")
}

@Sql('ContractsControllerFT.GeRegisteredServices.sql')
def 'should return 200 if server have registered contracts'() {
when:
def response = RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get("/contracts/services/test-provider")
.then()
.statusCode(200)
.contentType("text/plain;charset=UTF-8")
.extract().body().asString()

then:
response == "test-provider"
}

@Sql('ContractsControllerFT.GeRegisteredServices.sql')
def 'should return 404 if server not have registered contracts'() {
expect:
RestAssured.given()
.port(serverPort)
.contentType("application/json")
.when()
.get("/contracts/services/test-provider9")
.then()
.statusCode(404)
}

def loadFromFileAndFormat(String filePath) {
new File("src/test/resources/$filePath").text.replaceAll('\n','').replaceAll('\r','')
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.hltech.judged.server

import groovy.sql.Sql

import java.util.concurrent.TimeUnit
import static org.awaitility.Awaitility.await


class DbHelper {

static ALL_TABLE_NAMES = ['capabilities', 'databasechangelog', 'databasechangeloglock', 'environments',
'expectations', 'service_contracts', 'service_versions']

Sql sql

DbHelper(Sql sql) {
this.sql = sql
}

def fetchCapabilities() {
sql.rows("select * from capabilities" as String)
}

def fetchExpectations() {
sql.rows("select * from expectations" as String)
}

def fetchServiceContracts() {
sql.rows("select * from service_contracts" as String)
}

def clearTables() {
ALL_TABLE_NAMES.each {tableName ->
await().atMost(10, TimeUnit.SECONDS).until({
sql.execute("delete from $tableName" as String)
sql.rows("select * from $tableName" as String).size() == 0
})
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.hltech.judged.server

import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.ApplicationContextInitializer
import org.springframework.core.annotation.AliasFor
import org.springframework.test.context.ActiveProfiles
import org.springframework.test.context.ContextConfiguration

import java.lang.annotation.ElementType
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
import java.lang.annotation.Target

import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration
@SpringBootTest(classes = App.class, webEnvironment = RANDOM_PORT)
@ActiveProfiles("test")
@interface FunctionalTest {

@AliasFor(annotation = ContextConfiguration.class, attribute = 'initializers')
Class<? extends ApplicationContextInitializer> initializers() default PostgresPropertiesInitializer
}
Loading

0 comments on commit cdf0c47

Please sign in to comment.