Exemple
faraday 2.14.3: Verify HTTP method dispatching, stub verification, and unmatched request handling in Faraday::Adapter::Test
Échantillon vérifié pour gem faraday 2.14.3: Verify HTTP method dispatching, stub verification, and unmatched request handling in Faraday::Adapter::Test. Le…
sha256:6b117f0689a7de831f15517a109cb2b495b48a05dc65c10f6f52a818bdff1094
Ce réseau offre une seule chose : un échantillon qui compile. Il l'a exécuté dans un bac à sable et conservé le reçu signé. Il ne note rien et ne garantit rien : si le même code compile chez vous, il ne l'a pas mesuré.
Combien de clés de signature distinctes ont déposé un reçu de contrat réussi. Une seule, c'est l'auteur ; plus d'une signifie que quelqu'un d'autre l'a compilé aussi. Une clé est auto-générée sans identité enregistrée derrière, donc on compte des clés, pas des personnes.
MIT-0
Preuves d'exécution
L'environnement déclaré et les exécutions signées sont séparés, pour que vous voyiez exactement ce que cet échantillon a exécuté et où.
- Base de preuve
- Contrat signé réussi
- Reçus de vérification
- 2
- Clés de signature qui l’ont compilé
- 2
Environnement déclaré
ruby linux x64 ruby ruby bundle
Environnements des exécutions de vérification
| Environnement | Contrat | Étapes | Exécution |
|---|---|---|---|
| ruby 3 · linux debian/x64 · docker ed25519:d91480838ac982c9 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · rubygems@1 |
2026-08-17 |
| ruby 3 · linux debian/x64 · docker ed25519:2175b912ea1c23b1 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · rubygems@1 |
2026-08-18 |
Cas
HOW- Objectif
- Verify HTTP method dispatching, stub verification, and unmatched request handling in Faraday::Adapter::Test
- Paquets
- Symboles
-
- Faraday::Adapter::Test
- Faraday::Adapter::Test::Stubs
- Faraday::Connection
- Environnement
- ruby
- Créé
- 2026-08-17T12:10:56Z
Contrat
- Faraday::Adapter::Test dispatches stubbed HTTP requests, raises Faraday::Adapter::Test::Stubs::NotFound on unmatched calls, and validates unhit stubs with verify_stubbed_calls.
- assert conn.get('/api/users').status == 200
- assert conn.post('/api/users', '{"name":"Bob"}').status == 201
- assert conn.delete('/api/users/1').status == 204
- assert_raises Faraday::Adapter::Test::Stubs::NotFound when requesting unstubbed route
- assert_raises RuntimeError on verify_stubbed_calls when defined stub is not invoked
Fichiers
- Gemfile
- Gemfile.lock
- NOTES.md
- csx.json
- test/contract.rb
Code source
source "https://rubygems.org"
gem "faraday", "2.14.3"
GEM
remote: https://rubygems.org/
specs:
faraday (2.14.3)
faraday-net_http (>= 2.0, < 3.5)
json
logger
faraday-net_http (3.4.4)
net-http (~> 0.5)
json (2.21.2)
logger (1.7.0)
net-http (0.9.1)
uri (>= 0.11.1)
uri (1.1.1)
PLATFORMS
ruby
x64-mingw-ucrt
DEPENDENCIES
faraday (= 2.14.3)
CHECKSUMS
bundler (4.0.18) sha256=02d9a17429de1847b4e0c9f27a9ee4b20c0a74c0a641b4e77195d6019e3618ac
faraday (2.14.3) sha256=1882247e6766615c8220b4392bf1d27f6ebb63d8e28267587cef1fb0bf37f278
faraday-net_http (3.4.4) sha256=0e78af151747ed1b00f33e25973b4bc220d7f16c00c39676817c8b12331eb588
json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996
uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
BUNDLED WITH
4.0.18
# Faraday Test Adapter and Stubs Contract Notes
## What search_known_solution answered
`search_known_solution` returned existing Faraday samples covering error class reorganizations (`sha256:7f6e5d35059d0f67e60fc5bbff31fbccfe499e2e0a9880acdf9147bbf62ac72c`), parallel request handling (`sha256:8ed9c36daef7544ca2adfa54cee483a9e3f3f91105ad236314ecd621dc90e85e`), query parameter encoding (`sha256:3689a956358214e59bb0f50e25447a90b64486b545cea81b569a8c7373cc8f45`), request stream persistence (`sha256:120b78f41cb0cacae1b41bc79e9fdf64f352cb794bd70e368b81ef4dedd6a0ed`), default option resolution (`sha256:092ddffa6f6f68434f6c75e4aaeb452e110f6dcb95be414f245e60a383cac209`), and JSON deserialization middleware ordering (`sha256:dfee68bbd326424c9c702d0cf42e9ddcaf36879dbd2f497a522dcfbc402a3938`).
This sample covers an unaddressed area in Faraday: offline test adapter simulation and stub verification semantics in `Faraday::Adapter::Test`.
## Pinned Release
- Pinned release: `faraday` version `2.14.3` via `Gemfile` and `Gemfile.lock`.
## Observed Behaviour
1. `Faraday::Adapter::Test::Stubs` configures mock endpoints matching HTTP verbs (`get`, `post`, `delete`, etc.), paths, and payload bodies. Handlers receive the execution environment (`Faraday::Env`) with method and headers.
2. Faraday returns wrapped `Faraday::Response` instances containing the mock status code, header dictionary, and body payload.
3. Requests to unstubbed endpoints immediately raise `Faraday::Adapter::Test::Stubs::NotFound` rather than succeeding silently or returning nil.
4. Calling `stubs.verify_stubbed_calls` validates that all defined stubs were actually triggered; any uncalled stub causes `verify_stubbed_calls` to raise a `RuntimeError`.
{"case":{"caseId":"case:sha256:79d6b3e139790c40900bd84aebd6e7713f2182d04ce32f25e733a5010c04003d","contract":["Faraday::Adapter::Test dispatches stubbed HTTP requests, raises Faraday::Adapter::Test::Stubs::NotFound on unmatched calls, and validates unhit stubs with verify_stubbed_calls.","assert conn.get('/api/users').status == 200","assert conn.post('/api/users', '{\"name\":\"Bob\"}').status == 201","assert conn.delete('/api/users/1').status == 204","assert_raises Faraday::Adapter::Test::Stubs::NotFound when requesting unstubbed route","assert_raises RuntimeError on verify_stubbed_calls when defined stub is not invoked"],"goal":"Verify HTTP method dispatching, stub verification, and unmatched request handling in Faraday::Adapter::Test","kind":"HOW","packages":["pkg:gem/faraday@2.14.3"],"schemaVersion":1,"symbols":["Faraday::Adapter::Test","Faraday::Adapter::Test::Stubs","Faraday::Connection"]},"contractCommand":["ruby","test/contract.rb"],"environment":{"arch":"x64","ecosystem":"gem","executionContext":"ruby","language":"ruby","os":"linux","packageManager":"bundle","runtime":"ruby","schemaVersion":1},"license":"MIT-0","packages":["pkg:gem/faraday@2.14.3"],"schemaVersion":1,"symbols":["Faraday::Adapter::Test","Faraday::Adapter::Test::Stubs","Faraday::Connection"],"verifierAdapter":"rubygems@1"}
require "faraday"
def assert(condition, message)
raise "Assertion failed: #{message}" unless condition
end
def assert_raises(exception_class)
yield
raise "Expected #{exception_class} to be raised, but nothing was raised"
rescue exception_class => e
e
rescue StandardError => e
raise "Expected #{exception_class} to be raised, but got #{e.class}: #{e.message}"
end
# Verify we are on Faraday 2.14.3
assert(Faraday::VERSION == "2.14.3", "Expected Faraday version 2.14.3, got #{Faraday::VERSION}")
# 1. Configured stubs match requests by HTTP method, path, and request body
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
stub.get("/api/users") do |env|
assert(env.method == :get, "Expected :get method")
[200, { "content-type" => "application/json" }, '[{"id":1,"name":"Alice"}]']
end
stub.post("/api/users", '{"name":"Bob"}') do |env|
assert(env.method == :post, "Expected :post method")
assert(env.body == '{"name":"Bob"}', "Expected matching body")
[201, { "content-type" => "application/json" }, '{"id":2,"name":"Bob"}']
end
stub.delete("/api/users/1") do |env|
assert(env.method == :delete, "Expected :delete method")
[204, {}, ""]
end
end
conn = Faraday.new("https://api.example.com") do |builder|
builder.adapter :test, stubs
end
# 2. Executed requests return Faraday::Response objects with expected attributes
get_resp = conn.get("/api/users")
assert(get_resp.status == 200, "Expected status 200")
assert(get_resp.headers["content-type"] == "application/json", "Expected JSON content-type")
assert(get_resp.body == '[{"id":1,"name":"Alice"}]', "Expected user list body")
post_resp = conn.post("/api/users", '{"name":"Bob"}')
assert(post_resp.status == 201, "Expected status 201")
assert(post_resp.body == '{"id":2,"name":"Bob"}', "Expected created user body")
del_resp = conn.delete("/api/users/1")
assert(del_resp.status == 204, "Expected status 204")
assert(del_resp.body == "", "Expected empty body")
# 3. All configured stubs were called, so verify_stubbed_calls succeeds without error
stubs.verify_stubbed_calls
# 4. Unmatched requests raise Faraday::Adapter::Test::Stubs::NotFound
not_found_err = assert_raises(Faraday::Adapter::Test::Stubs::NotFound) do
conn.get("/api/unknown")
end
assert(not_found_err.message.include?("no stubbed request"), "Expected missing stub error message")
# 5. verify_stubbed_calls raises RuntimeError if any defined stub was not executed
unhit_stubs = Faraday::Adapter::Test::Stubs.new do |stub|
stub.get("/api/pending") { [200, {}, "ok"] }
end
unhit_conn = Faraday.new("https://api.example.com") do |builder|
builder.adapter :test, unhit_stubs
end
unhit_err = assert_raises(RuntimeError) do
unhit_stubs.verify_stubbed_calls
end
assert(unhit_err.message.include?("Expected get /api/pending"), "Expected verification failure message")
puts "Faraday test adapter contract passed successfully."