# Learning Outcomes
| Step | Title | Concept Covered | Learning objectives | Further Reading |
|----------------------------------------------------------------------|---------------------------------------------------------|------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| [step 1](https://github.com/pact-foundation/pact-workshop-js/tree/step1) | Create our consumer before the Provider API even exists | Consumer-driven design |
| - https://martinfowler.com/articles/consumerDrivenContracts.html
| |
| [step 2](https://github.com/pact-foundation/pact-workshop-js/tree/step2) | Write a unit test for our consumer | - | - How to write a basic unit test for an HTTP Client
- Understand how a unit test is unable to catch certain integration issues
| - https://docs.pact.io/faq/convinceme
|
| [step 3](https://github.com/pact-foundation/pact-workshop-js/tree/step3) | Write a Pact test for our consumer | Consumer side pact test | - Understand basic Consumer-side Pact concepts
- Understand "Matchers" to avoid test data brittleness
- Demonstrate that Pact tests are able to catch a class of integration problems
| - https://docs.pact.io/5-minute-getting-started-guide#scope-of-a-consumer-pact-test
- https://docs.pact.io/best_practices/consumer
| |
| [step 4](https://github.com/pact-foundation/pact-workshop-js/tree/step4) | Verify the consumer pact with the Provider API | Provider side pact test | - Understand basic Provider-side Pact concepts
- Place provider side testing in a broader testing context (e.g. where it fits on the pyramid)
| - https://docs.pact.io/5-minute-getting-started-guide#scope-of-a-provider-pact-test
|
| [step 5](https://github.com/pact-foundation/pact-workshop-js/tree/step5) | Fix the consumer's bad assumptions about the Provider | Humans talking to humans (collaboration) | - Understand that a tool facilitates collaboration, it doesn't replace it
| |
| [step 6](https://github.com/pact-foundation/pact-workshop-js/tree/step6) | Write a pact test for `404` (missing User) in consumer | Testing API invariants | - Understand how we can test "stateful" APIs without having to create complex, sequential API calls
| |
| [step 7](https://github.com/pact-foundation/pact-workshop-js/tree/step7) | Update API to handle `404` case | Provider States | - How Pact deals with "stateful" interactions, via the concept of "Provider States"
| - https://docs.pact.io/getting_started/provider_states
|
| [step 8](https://github.com/pact-foundation/pact-workshop-js/tree/step8) | Write a pact test for the `401` case | Testing authenticated APIs | - Service evolution - adding a new feature
| |
| [step 9](https://github.com/pact-foundation/pact-workshop-js/tree/step9) | Update API to handle `401` case | Service evolution | - Understand the challenge of dealing with complex/dynamic data, such as time-bound authentication tokens
| |
| [step 10](https://github.com/pact-foundation/pact-workshop-js/tree/step10) | Fix the provider to support the `401` case | Request filters | - Understand Pact's approach to dealing with complex/dynamic data, such as time-bound authentication tokens
| |
| [step 11](https://github.com/pact-foundation/pact-workshop-js/tree/step11) | Implement a broker workflow for integration with CI/CD | Automation | - Understand how to use Pact in a CI and CD workflow
| - https://docs.pact.io/pact_broker
- https://docs.pact.io/best_practices/pact_nirvana
|