Exemplo de como deve ser implementação de nirvana do teste de contrato com Pact seguindo todas as práticas descritas em https://docs.pact.io/pact_nirvana

Overview

Exemplo de 'Nirvana' do teste de contrato

Esse repositório exemplifica as melhores implementações de teste de contrato, atingindo o nirvana e tendo controle via pipeline e pact-broker de maneira totalmente confiável, fornecendo segurança para seguir com deploy.


Base de teste de contrato

Para aproveitar o repositório da melhor maneira consulte os seguintes materiais, necessários para conhecer os conceitos de teste de contrato:

  1. Introduction - Documentação do Pact
  2. AT Talks: Teste de contrato com Pact
  3. Testes de contratos com PACT #1 Conceitos - Vinícius Ribeiro

Sobre o repositório

O intuito desse material é demonstrar como deve ser a implementação de pipeline e testes de contrato de aplicações provider e consumer de forma com que siga o que é considerado o Nirvana do Pact.

O diagrama abaixo é a representação do Nirvana do Pact que foi implementado nesse repositório.

Diagrama - 'Nirvana' do teste de contrato

O pact-cli informado no diagrama se refere a comandos do Pact Broker Client.


Aplicações

As aplicações utilizadas estão divididas em 2 diretórios, tendo cada um seus arquivos fonte (/src), testes, dockerfile, package.json, etc, bem como cada aplicação tem sua pipeline implementada em .github/workflows.

Provider - clientsService

O provider é a aplicação que provem API para ser consumido por outro serviço. Está em provider-clients-service.

A pipeline do provider é executada apenas quando há alteração fora do diretório consumer-frontend (consumer).

Consumer - Frontend

O consumer é a aplicação que consome outra API. Pode também ser um provider. Está em consumer-frontend.

A pipeline do consumer é executada apenas quando há alteração fora do diretório provider-clients-service (provider).

Execução

Pré-requisitos

Teste de contrato do Consumer

make consumer-test-contract

Após a execução é gerado o contrato em consumer-frontend/pacts e log.

Como demonstrado no diagrama, a publicação do pact gerado no Pactflow é feita utilizando o comando publish do pactfoundation/pact-cli e apenas no CI, como pode ser visto na pipeline consumer-ci.

Teste de contrato do Provider

make provider-test-contract

Para conseguir executar o teste do provider altere o arquivo docker-compose conforme o exemplo abaixo para utilizar o token de leitura do Pactflow e possibilitar que baixe os contratos publicados pelo consumer.

    environment:
-     - PACT_BROKER_TOKEN
+     - PACT_BROKER_TOKEN='8sRF-XWVFpfLRpLp2B-lLw'
      - PACT_URL

A publicação de resultado da execução é feito apenas via CI. (publishVerificationResult: process.env.CI == 'true')

Webhook

Quando o consumer publica um novo contrato é preciso garantir que o provider tenha feito execução encima desse contrato.

Para que isso ocorra é utilizado webhook no Pactflow que, ao identificar que foi publicado contrato com conteúdo alterado ou uma nova tag (nova branch), trigga a pipeline do provider passando a URL desse contrato.

A pipeline chamada via webhook é a provider-ci-triggered-by-webhook.yml.

A configuração do can-i-deploy na pipeline do consumer permite que aguarde a execução do teste de contrato pelo provider e a publicação do resultado para saber se é possível ou não prosseguir com o novo contrato.

Print da configuração de webhook utilizada

Print de webhook

You might also like...

nest연습용 (w. https://github.com/seuiggi, https://github.com/okysky1121)

A progressive Node.js framework for building efficient and scalable server-side applications. Description Nest framework TypeScript starter repository

Oct 5, 2022

Projeto realizado como meio de aprendizado do Front-End e do Bootstrap. Tentei testar algumas animações e expor o máximo de criatividade possível😜

Projeto realizado como meio de aprendizado do Front-End e do Bootstrap. Tentei testar algumas animações e expor o máximo de criatividade possível😜

Steck Cars Demonstração : Sobre Projeto realizado como meio de aprendizado do Front-End e do Bootstrap. Tentei testar algumas animações e expor o máxi

Jan 10, 2022

promiseTimeout es como un setTimeout cualquiera, con la diferencia de que retorna una promesa

promiseTimeout es como un setTimeout cualquiera, con la diferencia de que retorna una promesa. Lo que permite un mejor manejo de la asincronía.

Nov 4, 2022

Essa API tem como objetivo auxiliar na produção de documentação de métodos e design packs, fornecendo de maneira visual a documentação de cores para api's

Essa API tem como objetivo auxiliar na produção de documentação de métodos e design packs, fornecendo de maneira visual a documentação de cores para api's

DocColors-API Essa API tem como objetivo auxiliar na produção de documentação de métodos e design packs, fornecendo de maneira visual a documentação d

Feb 4, 2022

Projeto de Final de Módulo da Resilia, curso de Web Dev Full Stack, utilizando como base Node.js e Javascript.

🚚 API Transportadora Projeto de encerramento do módulo 4 da Resilia Educação. O objetivo é desenvolver uma API Rest de uma transportadora. 📮 Pré-req

Mar 26, 2022

Breve explicacion de Mongoose, asi como un codigo con las operaciones CRUD

Breve explicacion de Mongoose, asi como un codigo con las operaciones CRUD

Introduccion a Mongoose ¿Qué es MongoDB? MongoDB es una base de datos NoSQL (Not Only SQL) y por ende no relacional que es utilizado para proyectos we

Mar 17, 2022

Repositório criado para prática do dia 14/05 utilizando nodeJs, express, nodemon e MVC. Como base utilizamos o modelo ER criado para uma locadora de filmes fictícia.

gamabuster Repositório criado para prática do dia 14/05 utilizando nodeJs, express, nodemon e MVC. Como base utilizamos o modelo ER criado para uma lo

May 18, 2022

A AfirmaJobs é uma plataforma de divulgação de vagas voltadas para a diversidade e inclusão. A aplicação foi desenvolvida como projeto final do curso bootcamp da Reprograma

A AfirmaJobs é uma plataforma de divulgação de vagas voltadas para a diversidade e inclusão. A aplicação foi desenvolvida como projeto final do curso bootcamp da Reprograma

AFIRMAJOBS Este projeto é resultado do Bootcamp Back-End - Todas em Tech - { reprograma } Justificativa Grupos historicamente minorizados – população

Dec 13, 2022

O projeto MKS Sistemas tem como objetivo o desenvolvimento de uma aplicação em React que utilize endpoint da API de produtos fornecida pela própria MKS Sistemas.

  O projeto MKS Sistemas tem como objetivo o desenvolvimento de uma aplicação em React que utilize endpoint da API de produtos fornecida pela própria MKS Sistemas.

MKS front-end Descrição O projeto MKS Sistemas tem como objetivo o desenvolvimento de uma aplicação em React que utilize endpoint da API de produtos f

Jul 21, 2022
Comments
  • Recommended CI/CD Workflow Updates

    Recommended CI/CD Workflow Updates

    Updates to contract-test-nirvana to meet new recommended workflow

    Tags that represent branches and environments are being replaced with first class support for branches, environments, deployments and releases.

    Background https://docs.pact.io/blog/2021/07/04/why-we-are-getting-rid-of-tags

    Bonus items

    • Updated Pact JS to latest version
    • Updated Pact JS tests to use PactV3 removing the lifecycle hooks, and now generating V3 pact files
    • Added a helper into the Makefile for users to create their first webhook

    Thanks for the great work on this so far!

    opened by YOU54F 1
  • Pact js v10 upgrade v3 spec

    Pact js v10 upgrade v3 spec

    Update Pact-JS to V10 which uses the rust core

    makes provisions for containers, as Alpine is not supported

    Uses the PactV3 interface to generate V3 specs

    opened by YOU54F 0
  • fix: machine executor

    fix: machine executor

    • corrects the machine executor to a valid value (machine executor is not a valid value, and therefore builds timeout)
    • lint corrects the workflow files
    opened by YOU54F 0
  • Update for branches and environments?

    Update for branches and environments?

    Gosh I love this!!! The only thing that could make it any better would be using branches and environments instead of tags. Would you be interested in making the changes required? I can point you in the right direction if you are. They're actually quite small.

    opened by bethesque 2
Owner
Paulo Gonçalves
Sr Test Engineer at @pagarme
Paulo Gonçalves
docs: Repository for OSS Docs

Kubeslice Documentation This project repository contains the documentation for Kubeslice. We are so glad that you want to contribute! Prerequisites To

kubeslice 26 Jan 3, 2023
Este projeto procura aplicar boas práticas de acessibilidade web

Acessibilidade ?? Screenshots do Projeto ?? Sobre o Projeto Este projeto procura aplicar boas práticas de acessibilidade web. Para visualizar o projet

Éverton Toffanetto 6 Feb 8, 2022
Implementação do Observer Pattern em TypeScript para o Código Fonte TV

Observer - Design Pattern Exemplos de implementação do Design Pattern Observer, descrito no livro Design Patterns: Elements of Reusable Object-Oriente

Gabriel Froes 11 Nov 30, 2022
Projeto de exemplo para realização de testes de integração (API) utilizando o Cypress

Projeto de exemplo para realização de testes de integração (API) utilizando o Cypress

Robson Agapito Correa 14 Nov 28, 2022
CRUD baseado no exemplo da @glaucia86

This is Node.js + Express rest API with a Relational Database in PostgreSQL. Front-end builded in Vue.js + Boostrap 4. --> How to run the API clone re

Francisco Guilherme 4 Mar 11, 2022
Todas as aulas da Semana JS Expert 5.0 - Google Drive Clone

Google Drive Clone - Semana JS Expert 5.0 Seja bem vindo(a) à quinta Semana Javascript Expert. Este é o código inicial para iniciar nossa jornada. Mar

Erick Wendel 1.5k Dec 29, 2022
Welcome To Amru Ser Wa Bot🙂. Tnx to ABUSER❤️

Project created by AMRU-SER to make it public | © | Reserved | Setup Click Instagram logo to follow this page ?? Simple Method The Hard Method GET QR

null 41 Jan 1, 2023
Arquitetura que possa vir a ser utilizada para um micro serviço em nodejs com nestjs e typescript

Descrição Exemplo prático de uma API desenvolvida em NodeJs com NestJs e Banco de Dados Postgres Instalação Instalando as dependencias $ npm install

Vinicius Barbosa Honorio 2 Jan 11, 2022
Um timer feito para ser usado para cronometrar os intevralos entre as aulas da Trybe, desenvolvido em Electron

electron-quick-start Clone and run for a quick way to see Electron in action. This is a minimal Electron application based on the Quick Start Guide wi

VICTOR GABRIEL RODRIGUES LINS 2 Nov 27, 2022
The Remix version of the fakebooks app demonstrated on https://remix.run. Check out the CRA version: https://github.com/kentcdodds/fakebooks-cra

Remix Fakebooks App This is a (very) simple implementation of the fakebooks mock app demonstrated on remix.run. There is no database, but there is an

Kent C. Dodds 61 Dec 22, 2022