Test layers aren't isolated — they deliberately overlap at the integration boundary. Only when combined do they guarantee a stable, fully covered system.
Isolated network — no internet access. Backend thinks it talks to real APIs, but DNS resolves all external domains to WireMock. Zero code changes required.
our code works correctly
APIs still match our mocks
stable, fully tested system
Verify our code from UI to API client layer using mocked responses. Fast, deterministic, run on every PR. If these fail → bug in our code.
Verify that real APIs still return what our mocks expect. Run daily / pre-release. If these fail → API changed, update fixtures.
Both test layers share the same adapter boundary. Contract tests validate mocks. E2E tests use those mocks. This overlap guarantees no gaps.
WireMock DNS proxyon: pull_requestschedule: dailyon: push