au.com.dius.pact.server.Create.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pact-jvm-server_2.10 Show documentation
Show all versions of pact-jvm-server_2.10 Show documentation
Pact server
===========
The pact server is a stand-alone interactions recorder and verifier, aimed at clients that are non-JVM or non-Ruby based.
The pact client for that platform will need to be implemented, but it only be responsible for generating the `JSON`
interactions, running the tests and communicating with the server.
The server implements a `JSON` `REST` Admin API with the following endpoints.
/ -> For diagnostics, currently returns a list of ports of the running mock servers.
/create -> For initialising a test server and submitting the JSON interactions. It returns a port
/complete -> For finalising and verifying the interactions with the server. It writes the `JSON` pact file to disk.
## Running the server
$ sbt pact-jvm-server/run
By default will run on port `29999` but a port number can be optionally supplied.
## Life cycle
The following actions are expected to occur
* The client calls `/create` to initialise a server with the expected `JSON` interactions and state
* The admin server will start a mock server on a random port and return the port number in the response
* The client will execute its interaction tests against the mock server with the supplied port
* Once finished, the client will call `/complete' on the Admin API, posting the port number
* The pact server will verify the interactions and write the `JSON` `pact` file to disk under `/target`
* The mock server running on the supplied port will be shutdown.
## Endpoints
### /create
The client will need `POST` to `/create` the generated `JSON` interactions, also providing a state as a query parameter.
For example:
POST http://localhost:29999/create?state=NoUsers '{ "provider": { "name": "Animal_Service"}, ... }'
This will create a new running mock service provider on a randomly generated port. The port will be returned in the
`201` response:
{ "port" : 34423 }
### /complete
Once the client has finished running its tests against the mock server on the supplied port (in this example port
`34423`) the client will need to `POST` to `/complete` the port number of the mock server that was used.
For example:
POST http://localhost:29999/complete '{ "port" : 34423 }'
This will cause the Pact server to verify the interactions, shutdown the mock server running on that port and writing
the pact `JSON` file to disk under the `target` directory.
### /
The `/` endpoint is for diagnostics and to check that the pact server is running. It will return all the currently
running mock servers port numbers.
For example:
GET http://localhost:29999/
'{ "ports": [23443,43232] }'
The newest version!
package au.com.dius.pact.server
import au.com.dius.pact.com.typesafe.scalalogging.StrictLogging
import au.com.dius.pact.consumer.DefaultMockProvider
import au.com.dius.pact.model._
import scala.collection.JavaConversions
object Create extends StrictLogging {
def create(state: String, requestBody: String, oldState: ServerState, config: Config): Result = {
val pact = PactReader.loadPact(requestBody).asInstanceOf[RequestResponsePact]
val mockConfig: MockProviderConfig = MockProviderConfig.create(config.host, config.portLowerBound, config.portUpperBound,
PactSpecVersion.fromInt(config.pactVersion))
val server = DefaultMockProvider.apply(mockConfig)
val port = server.config.getPort
val entry = port -> server
val body = OptionalBody.body("{\"port\": " + port + "}")
server.start(pact)
Result(new Response(201, JavaConversions.mapAsJavaMap(ResponseUtils.CrossSiteHeaders ++
Map("Content-Type" -> "application/json")), body), oldState + entry)
}
def apply(request: Request, oldState: ServerState, config: Config): Result = {
def errorJson = OptionalBody.body("{\"error\": \"please provide state param and pact body\"}")
def clientError = Result(new Response(400, JavaConversions.mapAsJavaMap(ResponseUtils.CrossSiteHeaders), errorJson),
oldState)
logger.debug(s"path=${request.getPath}")
logger.debug(s"query=${request.getQuery}")
logger.debug(request.getBody.toString)
val result = if (request.getQuery != null) {
for {
stateList <- CollectionUtils.javaLMapToScalaLMap(request.getQuery).get("state")
state <- stateList.headOption
body <- Option(request.getBody)
} yield create(state, body.getValue, oldState, config)
} else None
result getOrElse clientError
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy