Cloud Bits: Bounded by contract

a close up of a typewriter with a sign that reads contact

Contract.make {
    request {
        method 'PUT'
        url '/fraudcheck'
        body([
                "client.id": $(regex('[0-9]{10}')),
                loanAmount : 99999
        ])
        headers {
            contentType('application/json')
        }
    }
    response {
        status OK()
        body([
                fraudCheckStatus  : "FRAUD",
                "rejection.reason": "Amount too high"
        ])
        headers {
            contentType('application/json')
        }
    }
}
<plugin>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-contract-maven-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        <baseClassForTests>com.varunu28.producerservice.BaseTestClass</baseClassForTests>
        <testFramework>JUNIT5</testFramework>
        <contractsMode>REMOTE</contractsMode>
        <contractsRepositoryUrl>file://${user.home}/.m2/repository</contractsRepositoryUrl>
        <contractDependency>
            <groupId>com.varunu28</groupId>
            <artifactId>contracts</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </contractDependency>
        <contractsPath>contracts/producer-service</contractsPath>
    </configuration>
</plugin>
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureStubRunner
public class ConsumerServiceApplicationTests {

    @StubRunnerPort("producer-service")
    int producerPort;

    @Autowired
    private LoanApplicationService loanApplicationService;

    @BeforeEach
    public void setup() {
        loanApplicationService.setPort(producerPort);
    }

    @Test
    public void shouldBeRejectedDueToAbnormalLoanAmount() {
        String response = loanApplicationService.loanApplication(99999, "1234567890");

        assert (response.contains("FRAUD"));
    }
}
name: Spring Cloud Contract Verification

on:
  push:
    paths:
      - 'spring-cloud-contract/**'
  pull_request:
    paths:
      - 'spring-cloud-contract/**'

jobs:
  contract-verification:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      
      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: '21'
          distribution: 'temurin'
          cache: 'maven'
      
      - name: Build and install contracts
        working-directory: ./spring-cloud-contract/contracts
        run: mvn clean install
      
      - name: Build and install producer-service with stubs
        working-directory: ./spring-cloud-contract/producer-service
        run: mvn clean install
      
      - name: Verify consumer-service with generated stubs
        working-directory: ./spring-cloud-contract/consumer-service
        run: mvn clean install
      
      - name: Test Results Summary
        if: always()
        run: |
          echo "Contract verification completed"
          echo "All services have been built and tested against the contract"

Misuse of contract testing

References