Skip to content

Commit

Permalink
support publishing of pact-jvm pacts
Browse files Browse the repository at this point in the history
  • Loading branch information
jbwheatley committed May 11, 2021
1 parent 0e4cab3 commit c79553b
Show file tree
Hide file tree
Showing 30 changed files with 328 additions and 121 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,38 @@
"name" : "scala-pact-consumer"
},
"interactions" : [
{
"description" : "Fetching least secure auth token ever",
"request" : {
"method" : "GET",
"path" : "/auth_token",
"headers" : {
"Accept" : "application/json",
"Name" : "Bob"
},
"matchingRules" : {
"$.headers.Name" : {
"match" : "regex",
"regex" : "^([a-zA-Z]+)$"
}
}
},
"response" : {
"status" : 202,
"headers" : {
"Content-Type" : "application/json; charset=UTF-8"
},
"body" : {
"token" : "abcABC123"
},
"matchingRules" : {
"$.body.token" : {
"match" : "regex",
"regex" : "^([a-zA-Z0-9]+)$"
}
}
}
},
{
"providerState" : "Results: Bob, Fred, Harry",
"description" : "Fetching results",
Expand Down Expand Up @@ -59,14 +91,36 @@
}
}
}
},
{
"providerState" : "Results: Bob, Fred, Harry",
"description" : "Fetching results",
"request" : {
"method" : "GET",
"path" : "/results"
},
"response" : {
"status" : 200,
"headers" : {
"Pact" : "modifiedRequest"
},
"body" : {
"count" : 3,
"results" : [
"Bob",
"Fred",
"Harry"
]
}
}
}
],
"metadata" : {
"pactSpecification" : {
"version" : "2.0.0"
},
"scala-pact" : {
"version" : "3.0.2-SNAPSHOT"
"version" : "3.2.2-SNAPSHOT"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,38 @@
"name" : "scala-pact-consumer"
},
"interactions" : [
{
"description" : "Fetching least secure auth token ever",
"request" : {
"method" : "GET",
"path" : "/auth_token",
"headers" : {
"Accept" : "application/json",
"Name" : "Bob"
},
"matchingRules" : {
"$.headers.Name" : {
"match" : "regex",
"regex" : "^([a-zA-Z]+)$"
}
}
},
"response" : {
"status" : 202,
"headers" : {
"Content-Type" : "application/json; charset=UTF-8"
},
"body" : {
"token" : "abcABC123"
},
"matchingRules" : {
"$.body.token" : {
"match" : "regex",
"regex" : "^([a-zA-Z0-9]+)$"
}
}
}
},
{
"providerState" : "Results: Bob, Fred, Harry",
"description" : "Fetching results",
Expand Down Expand Up @@ -59,14 +91,36 @@
}
}
}
},
{
"providerState" : "Results: Bob, Fred, Harry",
"description" : "Fetching results",
"request" : {
"method" : "GET",
"path" : "/results"
},
"response" : {
"status" : 200,
"headers" : {
"Pact" : "modifiedRequest"
},
"body" : {
"count" : 3,
"results" : [
"Bob",
"Fred",
"Harry"
]
}
}
}
],
"metadata" : {
"pactSpecification" : {
"version" : "2.0.0"
},
"scala-pact" : {
"version" : "3.0.2-SNAPSHOT"
"version" : "3.2.2-SNAPSHOT"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ object ScalaPactPlugin extends AutoPlugin {
val scalaPactEnv: SettingKey[ScalaPactEnv] =
SettingKey[ScalaPactEnv]("scalaPactEnv", "Settings used to config the running of tasks and commands")

val areScalaPactContracts: SettingKey[Boolean] = SettingKey[Boolean](
"scalaPactContracts",
"Whether the pacts to be published are scala-pact contracts, or pact-jvm contracts"
)

// Tasks
val pactPack: TaskKey[Unit] = taskKey[Unit]("Pack up Pact contract files")
val pactPush: InputKey[Unit] = inputKey[Unit]("Push Pact contract files to Pact Broker")
Expand Down Expand Up @@ -157,7 +162,8 @@ object ScalaPactPlugin extends AutoPlugin {
pactBrokerToken := "",
pactBrokerClientTimeout := 2.seconds,
sslContextName := None,
includePendingStatus := false
includePendingStatus := false,
areScalaPactContracts := true
)

@SuppressWarnings(Array("org.wartremover.warts.Any"))
Expand Down Expand Up @@ -195,7 +201,8 @@ object ScalaPactPlugin extends AutoPlugin {
pactContractTags.value,
PactBrokerAuthorization(pactBrokerCredentials.value, pactBrokerToken.value),
pactBrokerClientTimeout.value,
sslContextName.value
sslContextName.value,
areScalaPactContracts.value
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ object ScalaPactPublishCommand {
tagsToPublishWith: Seq[String],
pactBrokerAuthorization: Option[PactBrokerAuthorization],
pactBrokerClientTimeout: Duration,
sslContextName: Option[String]
sslContextName: Option[String],
isScalaPactContract: Boolean
)(implicit pactReader: IPactReader, pactWriter: IPactWriter, httpClientBuilder: IScalaPactHttpClientBuilder): Unit = {

PactLogger.message("*************************************".white.bold)
Expand All @@ -45,7 +46,8 @@ object ScalaPactPublishCommand {
tagsToPublishWith.toList,
pactBrokerAuthorization,
pactBrokerClientTimeout,
sslContextName
sslContextName,
isScalaPactContract
)
val publishResults = Publisher.apply.publishPacts(publishSettings, scalaPactSettings)
evaluatePublishResults(publishResults)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.itv.scalapact.plugin.shared

import com.itv.scalapact.shared.{IPactStubber, ScalaPactSettings}
import com.itv.scalapact.shared.{IPactStubber, Pact, ScalaPactSettings}
import com.itv.scalapact.shared.utils.ColourOutput._
import com.itv.scalapact.shared.http.SslContextMap
import com.itv.scalapact.shared.json.{IPactReader, IPactWriter}
import com.itv.scalapact.shared.json.{ContractDeserializer, IPactReader, IPactWriter}
import com.itv.scalapact.shared.utils.PactLogger
import com.itv.scalapactcore.common.LocalPactFileLoader._
import com.itv.scalapactcore.common.stubber.InteractionManager
Expand All @@ -18,10 +18,11 @@ object ScalaPactStubberCommand {
pactReader: IPactReader,
pactWriter: IPactWriter,
pactStubber: IPactStubber,
sslContextMap: SslContextMap
sslContextMap: SslContextMap,
pactDeserializer: ContractDeserializer[Pact]
): Unit = {
val loadPacts = loadPactFiles(pactReader)(true)(scalaPactSettings.giveOutputPath)
val addToManager = interactionManager.addToInteractionManager
val loadPacts: ScalaPactSettings => List[Pact] = loadPactFiles[Pact](true, scalaPactSettings.giveOutputPath)
val addToManager = interactionManager.addToInteractionManager

val launchStub: ScalaPactSettings => IPactStubber = setting => {
PactLogger.message(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.itv.scalapact.plugin.shared

import java.io.File

import com.itv.scalapact.shared.json.{IPactReader, IPactWriter}
import com.itv.scalapact.shared.{BuildInfo, Pact, ScalaPactSettings}
import com.itv.scalapact.shared.utils.ColourOutput._
Expand Down Expand Up @@ -50,7 +49,7 @@ object ScalaPactTestCommand {
pactReader: IPactReader,
pactWriter: IPactWriter
): Int = {
val jsonStringToPact: String => Option[Pact] = pactReader.jsonStringToPact(_).toOption
val jsonStringToPact: String => Option[Pact] = pactReader.jsonStringToScalaPact(_).toOption

val (failed, squashedPacts) =
files
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ object ScalaPactPlugin extends AutoPlugin {
val scalaPactEnv: SettingKey[ScalaPactEnv] =
SettingKey[ScalaPactEnv]("scalaPactEnv", "Settings used to config the running of tasks and commands")

val areScalaPactContracts: SettingKey[Boolean] = SettingKey[Boolean](
"scalaPactContracts",
"Whether the pacts to be published are scala-pact contracts, or pact-jvm contracts"
)

// Tasks
val pactPack: TaskKey[Unit] = taskKey[Unit]("Pack up Pact contract files")
val pactPush: InputKey[Unit] = inputKey[Unit]("Push Pact contract files to Pact Broker")
Expand Down Expand Up @@ -157,7 +162,8 @@ object ScalaPactPlugin extends AutoPlugin {
pactBrokerToken := "",
pactBrokerClientTimeout := 2.seconds,
sslContextName := None,
includePendingStatus := false
includePendingStatus := false,
areScalaPactContracts := true
)

@SuppressWarnings(Array("org.wartremover.warts.Any"))
Expand Down Expand Up @@ -195,7 +201,8 @@ object ScalaPactPlugin extends AutoPlugin {
pactContractTags.value,
PactBrokerAuthorization(pactBrokerCredentials.value, pactBrokerToken.value),
pactBrokerClientTimeout.value,
sslContextName.value
sslContextName.value,
areScalaPactContracts.value
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ object PactImplicits {
"templated"
)

implicit lazy val pactDecodeJson: DecodeJson[Pact] = DecodeJson[Pact] { cur =>
implicit lazy val scalaPactDecodeJson: DecodeJson[Pact] = DecodeJson[Pact] { cur =>
for {
provider <- cur.get[PactActor]("provider")
consumer <- cur.get[PactActor]("consumer")
Expand All @@ -28,7 +28,7 @@ object PactImplicits {
} yield Pact(provider, consumer, interactions, _links, metadata)
}

implicit lazy val PactEncodeJson: EncodeJson[Pact] = EncodeJson { p =>
implicit lazy val scalaPactEncodeJson: EncodeJson[Pact] = EncodeJson { p =>
Json.obj(
"provider" -> p.provider.asJson,
"consumer" -> p.consumer.asJson,
Expand All @@ -38,6 +38,21 @@ object PactImplicits {
)
}

implicit val jvmPactDecoder: DecodeJson[JvmPact] = DecodeJson { cur =>
for {
consumer <- cur.get[PactActor]("consumer")
provider <- cur.get[PactActor]("provider")
body = cur.focus.nospaces
} yield JvmPact(consumer, provider, body)
}

implicit val jvmPactEncoder: EncodeJson[JvmPact] = EncodeJson { jvmPact =>
Parse.parse(jvmPact.rawContents) match {
case Right(value) => value
case Left(error) => throw new Exception(s"Generated pact is not valid json: ${error}")
}
}

implicit lazy val PactActorCodecJson: CodecJson[PactActor] = casecodec1(PactActor.apply, PactActor.unapply)(
"name"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ class PactReader extends IPactReader {
def fromJSON(jsonString: String): Option[IrNode] =
JsonConversionFunctions.fromJSON(jsonString)

def jsonStringToPact(json: String): Either[String, Pact] =
readJson[Pact](json, "pact")
def jsonStringToScalaPact(json: String): Either[String, Pact] =
readJson[Pact](json, "scala-pact pact")

def jsonStringToJvmPact(json: String): Either[String, JvmPact] = readJson[JvmPact](json, "pact-jvm pact")

def jsonStringToPactsForVerification(json: String): Either[String, PactsForVerificationResponse] =
readJson[PactsForVerificationResponse](json, "pacts for verification")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,27 @@ package com.itv.scalapact.argonaut62

import argonaut.Argonaut._
import argonaut._
import com.itv.scalapact.shared.{Pact, PactMetaData, PactsForVerificationRequest, VersionMetaData}
import com.itv.scalapact.shared.{JvmPact, Contract, PactMetaData, PactsForVerificationRequest, Pact, VersionMetaData}
import com.itv.scalapact.shared.json.IPactWriter

class PactWriter extends IPactWriter {
import PactImplicits._

def pactToJsonString(pact: Pact, scalaPactVersion: String): String = {
val updatedMetaData: Option[PactMetaData] =
pact.metadata.orElse {
Option(
PactMetaData(
pactSpecification = Option(VersionMetaData("2.0.0")), //TODO: Where to get this value from?
`scala-pact` = Option(VersionMetaData(scalaPactVersion))
)
)
}

pact.copy(metadata = updatedMetaData).asJson.pretty(PrettyParams.spaces2.copy(dropNullKeys = true))
}
def pactToJsonString(pact: Contract, scalaPactVersion: String): String =
pact match {
case p: JvmPact => p.asJson.spaces2
case p: Pact =>
val updatedMetaData: Option[PactMetaData] =
p.metadata.orElse {
Option(
PactMetaData(
pactSpecification = Option(VersionMetaData("2.0.0")), //TODO: Where to get this value from?
`scala-pact` = Option(VersionMetaData(scalaPactVersion))
)
)
}
p.copy(metadata = updatedMetaData).asJson.pretty(PrettyParams.spaces2.copy(dropNullKeys = true))
}

def pactsForVerificationRequestToJsonString(request: PactsForVerificationRequest): String =
request.asJson.pretty(PrettyParams.spaces2.copy(dropNullKeys = true))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class RubyJsonHelperSpec extends FunSpec with Matchers {
describe("Handling ruby json") {

it("should be able to extract provider, consumer and list of interactions") {
val decodedPact = pactReaderInstance.jsonStringToPact(PactFileExamples.simpleAsString).toOption
val decodedPact = pactReaderInstance.jsonStringToScalaPact(PactFileExamples.simpleAsString).toOption

val interaction1 = Interaction(
providerState = Option("a simple state"),
Expand Down
Loading

0 comments on commit c79553b

Please sign in to comment.